/** @jsxImportSource @emotion/react */
import * as React from "react";
import {
    Button, Text, TextArea, useTheme, useToast,
} from "customize-easy-ui-component";
import {InspectRecordLayout, InternalItemProps, useItemInputControl} from "../../common/base";
import {setupItemAreaRoute} from "./orcIspConfig";
import {useMedia} from "use-media";
import {assertNamesUnique} from "../../common/eHelper";
import {EditStorageContext} from "../../StorageContext";
import {EachMeasureItemConfig} from "../../common/measure";
import {daL改造内容, daL重大修理内容, 施工许可证子项选,} from "../../tower/craneJj/orcBase";
import {multiCheckFor} from "../../common/general";
import {itemA结论} from "../../mobilecr/editorIN";
import {itemA技术见证} from "../../tower/editorJj";
import {config距离} from "../../mobilecr/Intial/orcBase";
import {itemA受力结构, item受力结构} from "../../tower/craneJj/editThicknes";
import {itemA应变应力} from "../../tower/craneJj/editStrainS";
import {EachMeasureCritConfig} from "../../common/msCriteria";
import {useMeasureInpFilter} from "../../common/hooks";
import {useMeasureItem, useMeasureRow} from "../../hook/useMeasure";
import {itemA间隙} from "./DoorGap";
import {config运行速度} from "./MoveSpeednoAv";
import {itemA漏磁检} from "../../gantry/portalJj/MagneticLeak";

export const render层站数 = {
    view: (orc: any) => {
        return <div css={{display: 'flex', justifyContent: 'space-around', alignItems: 'center'}}>
            <Text>{orc.电梯层数} 层</Text><Text>{orc.电梯站数} 站</Text>
        </div>
    },
};
export const  驱动装置选=["曳引机", "卷扬机", "电动葫芦", "液压泵站", "其他"];
export const config设备概况 = [
    [['安装改造重大修理单位名称', '新安改单']],
    [['施工单位生产许可证(受理决定书)编号', '施许可号'], ['安装改造重大修理单位负责人', '安单负责']],
    [['施工单位生产许可证许可子项目', {n: '施许可子', t: 'l', l: 施工许可证子项选}], ['施工单位联系电话', '施单联电'],],
    [['使用单位名称', '_$使用单位']],
    [['使用单位地址', '_$使用单位地址']],
    [['分支机构', '_$分支机构']],
    [['分支机构地址', '_$分支机构地址']],
    [['产权单位名称', '_$产权单位']],
    [['产权单位地址', '_$产权单位地址'] ],
    [['使用单位联系人', '_$单位联系人'], ['使用单位安全管理人员', '安全员']],
    [['使用单位联系电话', '_$使用单位电话'], ['安全管理人员联系电话', '安全员电']],
    [['使用单位统一社会信用代码', '_$使用单位信用码'], ['管理部门类型','_$使管部类型']],
    [['制造单位名称', '_$制造单位'] ],
    [['制造单位生产许可证编号', '生产许号'], ['制造单位生产许可证许可子项目', {n: '制许可子', t: 'l', l: 施工许可证子项选}], ],
    [['型号规格', '_$型号'], ['产品编号', '_$出厂编号'] ],
    [['是否型式试验样机',{n:'型试样机',t:'b'}], ['进口情况','_$进口类型'], ],
    //台账还没有增加的参数： 驱动装置
    [['驱动装置', {n: '驱动装置', t: 'l', l: 驱动装置选}], ['货厢门关闭方式','_$开关门驱动式'], ],
    [['制造日期', '_$制造日期'], ['投入使用日期', '_$投用日期'], ],
    //  ['设备型号', '设备型'], ？多余：
    [['单位内编号','_$单位内部编号'], ['设计使用年限','_$设计年限', '年'],],
    [['使用地点', '_$设备使用地点']],
    [['设备使用所在区域', '_$使用地区域'], ['设备型号', '设备型'], ],
        //升降机:额定载重=rtlf=额定载荷;
    [['额定起重量','_$额定载荷','t'], ['额定速度','_$额定速度','m/s'] ],
    [['提升高度', '_$提升高度','m'], ['层数', '_$电梯层数','层'] ],
    [['站数', '_$电梯站数','站'], ['门数', '_$电梯门数','门'] ],
    [['其他主要参数',{n:'其他参数',t:'m'}],   ],
    [['检验依据',{r:'《起重机械安全技术规程》（TSG 51-2023）'}]],
    [['下检日期','_$新下检日'], ['现场检验条件',{r:'见附录9'}], ],
    [['重大修理内容','',multiCheckFor(daL重大修理内容)]],
    [['改造内容','',multiCheckFor(daL改造内容)]],
    [['备注',{n:'概备注',t:'m'}]],
];

/**测量表：太多了可拆成两个编辑器； 注意：t: [] 不同于 t: [undefined,undefined,undefined]；
 * */
export const config观测数据 = [
    [{n: '圈框高', t: ['C3.7.4','圈框高度'], u: 'mm'}, ],
    [{n: '顶侧边距', t: [undefined,'离轿顶外侧边缘有水平方向距离'],  },],
    [{n: '护栏高', t: [undefined,'护栏高度'],  c: '四', d: '0'},],
    [{n: '中间间', t: [undefined,'中间间隔'],  c: '四', d: '0'},],
    [{n: '脚板高', t: [undefined,'踢脚板高度'], },],
    [{check: '3.7.4', }],
    [{n: '卷筒板', t: ['C3.8.2.1(4)','卷筒上压板数量'], u: '个'}, ],
    [{n: '绳夹数', t: [undefined,'绳夹数量'],  save: false},],
    [{n: '绳夹间', t: [undefined,'绳夹间距'],  u: 'mm', c: '弃', d: '2', save: false},],
    [{n: '编结长', t: [undefined,'钢丝绳编结长度'],  c: '弃', d: '2', save: false},],
    [{n: '安圈数', t: [undefined,'安全圈数'],  u: '圈', save: false},],
    [{n: '强制钢丝', t: [undefined,'强制式简易升降机钢丝绳'],  u: 'mm',c: '四',d: '1'},],
    [{check: '3.8.2.1(4)', }],
    [{n: '绝缘阻', t: ['C3.14','绝缘电阻'], u: 'MΩ',c: '四', d: '1',save: false}, ],
    [{check: '3.14',sync:'绝缘电阻'}],
    [{n: '平准度', t: ['C4.3.2.5', '平层准确度'], u: 'mm', c: '四', d: '0'},
    ],
    [{check: '4.3.2.5(1)'}],
    [{n: '平衡数', t: [undefined, '平衡系数'], u: '/', c: '四', d: '2'},
    ],
    [{check: '4.3.2.5(2)'}],
    [{n: '厢降距', t: [undefined, '货厢沉降距离'], u: 'mm', c: '四', },
    ],
    [{check: '4.3.2.5(3)'}],
    [{n: '验前温', t: ['C4.7.2.3','液压系统油液温升','试验前温度'], u:'℃',  omit:'4.7.2.3'},
        {n: '验后温', t: [undefined,undefined,'试验后温度'],   omit:true },
        {n: '温升值', t: [undefined,undefined,'温升值'], u:'℃',  omit:true },
        {n: '温升允', t: [undefined,undefined,'温升允许值'],   omit:true },
    ],
    [{check: '4.7.2.3'}],
    [{n: '货厢深', t: ['C5','货厢深度'], u: 'm', c: '四', d: '2'},
        {n: '货厢宽', t: [undefined,'货厢宽度'],  c: '四', d: '2'},
        {n: '货面积', t: [undefined,'面积'], u: 'm²', c: '四', d: '2'},
    ],
    [{check: 'C5', }],
] as EachMeasureItemConfig[][];

export const config梯子 = [
    [{n: '台净高', t: ['（1）通道与平台','通道、斜梯和平台的净空高度'], u: 'm', c: '四'}],
    [{n: '台净宽', t: [undefined,'运动部分附近的通道和平台的净宽度'], c: '四'}],
    [{n: '高不净宽', t: [undefined,'如果设有扶手或者栏杆，在高度不超过0.6m的范围内，通道的净宽度'], c: '四'}],
    [{n: '固道净宽', t: [undefined,'固定部分之间的通道净宽度'], c: '四'}],
    [{n: '少使高', t: [undefined,'起重机械结构件内部很少使用的进出通道','最小净空高度'], c: '四'}],
    [{n: '少使道宽', t: [undefined,undefined,'通道净宽度'], c: '四'}],
    [{n: '维保净高', t: [undefined,'只用于维护保养的平台，其上面的净空高度'], c: '四'}],
    [{n: '缝隙最宽', t: [undefined,'通道基面上缝隙长度等于或者大于200mm时，其最大宽度'], u: 'mm', c: '四'}],
    [{n: '动线上距', t: [undefined,'通道区域与裸露动力线，上方距离'], u: 'm', c: '四'}],
    [{n: '动线左右', t: [undefined,'通道区域与裸露动力线，左右距离'], c: '四'}],
    [{n: '动线下距', t: [undefined,'通道区域与裸露动力线，下方距离'], c: '四'}],
    [{n: '斜梯角', t: ['（2）梯子与栏杆','斜梯','斜梯的倾斜角'], u: '°', c: '四'}],
    [{n: '斜栏间距', t: [undefined,undefined,'主要斜梯栏杆的间距'], u: 'm', c: '四'}],
    [{n: '他斜栏间', t: [undefined,undefined,'其他斜梯栏杆的间距'], c: '四'}],
    [{n: '斜靠栏高', t: [undefined,undefined,'斜梯的一侧靠墙壁时，栏杆高度'], c: '四'}],
    [{n: '梯级宽', t: [undefined,undefined,'梯级的净宽度'], c: '四'}],
    [{n: '梯级高', t: [undefined,undefined,'单个梯级的高度'], c: '四'}],
    [{n: '直撑杆间', t: [undefined,'直梯','直梯两侧撑杆的间距'], c: '四'}],
    [{n: '撑梯级宽', t: [undefined,undefined,'两侧撑杆之间梯级宽度'], c: '四'}],
    [{n: '直梯级间', t: [undefined,undefined,'梯级的间距'], c: '四'}],
    [{n: '直护圈径', t: [undefined,undefined,'从高处有跌落危险的直梯，护圈直径'], c: '四'}],
    [{n: '直杆高出', t: [undefined,undefined,'直梯的两边撑杆比最上一个梯级高出的高度'], c: '四'}],
    [{n: '栏垂高', t: [undefined,'栏杆的垂直高度'], u: 'm', c: '四'}],
    [{n: '脚板高', t: [undefined,'踢脚板高度'], c: '四'}],
    [{n: '栏中间距', t: [undefined,'中间横杆，其与踢脚板或者栏杆的距离'], c: '四'}],
    [{n: '栏不道高', t: [undefined,'对净高不超过1.3m的通道，栏杆的高度'], c: '四'}],
    [{n: '扶手断长', t: [undefined,'沿建筑物墙壁或者实体墙结构设有的通道，允许用扶手代替栏杆，扶手的中断长度'], c: '四'}],
    [{n: '围绳高', t: [undefined,'护绳(如钢丝绳、链条)，高度'], c: '四'}],
    [{check: 'C3.7.4'}],
] as EachMeasureItemConfig[][];
export const config几何尺寸 = [
    [{n: '货厢长', t: ['长度'], u: 'm', },],
    //？两个地方都测量:货厢宽
    [{n: '厢宽度', t: ['宽度'],    },],
    [{n: '货厢高', t: ['高度'],    },],
    [{check: 'C3.6'}],
] as EachMeasureItemConfig[][];

export const tailZj观测= <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：1、未测量或无需测量的观测值和结果值栏可不填，检验结果栏都需填。（下同）<br/>
    2、其他需记录的测量值和结果值填在备注栏中。<br/>
    3、以设计文件作为检验结果判定依据时，设计要求值填在备注栏内
</Text>;
export const tail安距= <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：1、对于不合格的值才需测量和记录，未测量或无需测量的，仅填检验结果栏。<br/>
    2、以设计文件作为检验结果判定依据时，设计要求值填在备注栏内。
</Text>;
export const tail速度= <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：<br/>
    1、对于产品标准和设计文件同时对速度允许偏差都有规定的，以较严规定作为检验结果判定依据。对于
    产品标准和设计文件对速度允许偏差都没有规定的，相应的速度可不测量。<br/>
    2、以设计文件作为检验结果判定依据时，设计要求值填在备注栏内。
</Text>;

export const tail制动 = <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：1、对于产品标准和设计文件同时对制动距离都有规定的，以较严规定作为检验结果判定依据。对于产品标准和设计
    文件对制动距离都没有规定的，相应的制动距离可不测量。<br/>
    2、以设计文件作为检验结果判定依据时，设计要求值填在备注栏内。
</Text>;
export const tail几何 = <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：以设计图样要求作为检验结果判定依据。
</Text>;
export const tail梯子 = <Text css={{"@media print": {fontSize: '0.75rem'}}}>
    注：1、对于不合格的值才需测量和记录，未测量或无需测量的，仅填检验结果栏。<br/>
    2、以设计文件作为检验结果判定依据时，设计要求值填在备注栏内。
</Text>;

export const config制动距离 = [['制动厢', '货厢'],];

export const EntranceSetup =
    React.forwardRef((
        {show, alone = true, verId, rep}: InternalItemProps, ref
    ) => {
        const theme = useTheme();
        const atPrint = useMedia('print');
        const toast = useToast();
        const doCheckNames = React.useCallback((verId: string) => {
            const impressionismAs = setupItemAreaRoute({rep, noDefault: true, theme});
            const result = assertNamesUnique([{value: rep?.tzFields}, {value: impressionismAs?.Item, type: 'impr'},
                {value: config设备概况, type: 'esnt'},
                {value: [...itemA结论, ...itemA技术见证,]}, {value: config观测数据, type: 'mesB'},
                {value:[...itemA间隙, ] },     {value: config几何尺寸, type: 'mesB'},
                {value: [...item受力结构, ...itemA受力结构]},
                {value: config运行速度, type: 'moAR'},  {value: config制动距离, type: 'moAR'},
                {value:[...itemA漏磁检, ] },
            {value:['unq','仪器表','检验条件','观测备注','几何备注', '速度备注','制距备注' ]} ]);
        toast({title: "完成！", subtitle: result ? "没发现冲突" : "测试开关没开", intent: "success"});
    }, [rep,toast,theme]);
    const {storage, setStorage} =React.useContext(EditStorageContext) as any;
    const getInpFilter = React.useCallback((par: any) => {
        const {_tblFixed, } =par||{};
        return {_tblFixed, };
    }, []);
    const {inp, setInp} = useItemInputControl({ref});
    if (atPrint) return null;
    else return (
        <InspectRecordLayout inp={inp} setInp={setInp} getInpFilter={getInpFilter} show={show} alone={alone} label={'初始化本报告，默认值配置等'}>
            {process.env.REACT_APP_TEST==='true' && <><div>
                <Text variant="h5">构建开发模板时的工具：校验模板的存储name冲突；</Text>
                <Button intent='primary' onPress={() => doCheckNames(verId!)}>校验模板name唯一性</Button>
                <Text variant="h5">设置待测试表格的各列宽度：</Text>
                <TextArea value={storage?._tblFixed || ''} rows={2} onChange={e =>{
                    JSON.parse(e.currentTarget.value??'[]');
                    setStorage({ ...storage, _tblFixed: e.currentTarget.value || undefined}); }}/>
            </div>
            </>
            }
            <hr/>
        </InspectRecordLayout>
    );
});


export interface MeasureCritMemProps extends InternalItemProps {
    config: ((orc: any) => EachMeasureCritConfig[][]) | EachMeasureCritConfig[][];
    iAname?: string[];
    mem?: string;
    allowableV?: boolean;
    defaultSave?: boolean;
    // defaultV?: (par: any) => any;
}
/**【定制版】 需要联动计算， 无法从外部注入defaultV逻辑的。只能定做编辑器组件。
 * */
export const MeasureCalc =
    React.forwardRef((
        {
            children, show, alone = true, refWidth, label,
            config, iAname, allowableV = false, defaultSave = false, mem,
        }: MeasureCritMemProps, ref
    ) => {
        const {inp, setInp} = useItemInputControl({ref});
        const newconfig = React.useMemo(() => {
            return (typeof config === 'function' ? config(inp) : config);
        }, [inp, config]);
        const {itemObservation, itemObservationA,} = useMeasureItem(newconfig, allowableV);
        const {render} = useMeasureRow(inp, setInp, newconfig, allowableV, defaultSave);
        const itemA备注: string[] = mem ? [`${mem}`] : [];
        const itemA = React.useMemo(() => {
            return [...itemObservationA, ...itemA备注, ...iAname ?? []];
        }, [itemObservationA, iAname]);
        const [getInpFilter] = useMeasureInpFilter(itemObservation, itemA, );
        React.useEffect(() => {
            if(inp){        //这个必须判别inp?
                let areaV=(inp?.货厢深o * inp?.货厢宽o).toFixed(2);
                let newv= parseFloat(areaV);
                setInp({ ...inp, 货面积o: (isNaN(newv)? undefined : newv) });
            }
        }, [inp?.货厢深o,inp?.货厢宽o, setInp]);
        return (
            <InspectRecordLayout inp={inp} setInp={setInp} getInpFilter={getInpFilter} show={show}
                                 alone={alone} label={label!}>
                <Text variant="h5">{label}：</Text>
                {render}
                {mem && <>
                    <hr/>
                    备注：
                    <TextArea value={inp?.[mem] || ''} rows={5}
                              onChange={e => setInp({...inp, [mem]: e.currentTarget.value || undefined})}/>
                </>
                }
                {children}
            </InspectRecordLayout>
        );
});
